#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 错误：出现在编译器的问题，无法运行
# 异常：出现在运行时的问题，可以被捕获并处理

# 异常处理机制：    try...except...finally...
# try: 可能出现异常的语句块
# except: 捕获异常的语句块
# finally: 无论是否出现异常，都会执行的语句块

try:
    a = 10 / 0
except ZeroDivisionError:
    print("除数不能为0")
except: # 捕获所有异常
    print("未知异常")
finally:
    print("程序结束")

# 输出：除数不能为0
# 程序结束

raise ZeroDivisionError("除数不能为0") # 手动抛出异常

# 注意：
# 1. 多个except可以捕获不同类型的异常，但最多只会执行一个except块
# 2. 多个except块可以同时捕获同一类型的异常，但执行的顺序是从上到下，遇到第一个匹配的except块后，后面的except块不会再执行
# 3. 多个except块可以捕获同一类型的异常，但只有一个块会被执行，其他的块都不会被执行
# 4. 如果没有任何except块捕获到异常，则会引发一个新的异常，这个异常会被上层调用者捕获并处理
# 5. finally块无论是否出现异常，都会执行
# 6. 异常处理机制可以嵌套使用，但最多只能有一个try块
# 7. 异常处理机制可以配合else使用，但else块只能在没有异常发生的情况下执行
# 8. 异常处理机制可以配合return使用，但return只能在函数内部使用，不能在函数外部使用
# 9. 异常处理机制可以配合yield使用，但yield只能在生成器函数内部使用，不能在生成器函数外部使用
# 10. 异常处理机制可以配合with使用，但with只能在上下文管理器中使用，不能在函数外部使用
# 11. 异常处理机制可以配合raise使用，但raise只能在函数内部使用，不能在函数外部使用
# 12. 异常处理机制可以配合assert使用，但assert只能在测试代码中使用，不能在生产代码中使用
# 13. 异常处理机制可以配合try...else...finally...使用，但else块只能在没有异常发生的情况下执行，finally块无论是否出现异常，都会执行
# 14. 异常处理机制可以配合try...except...else...finally...使用，但else块只能在没有异常发生的情况下执行，finally块无论是否出现异常，都会执行
